public class Main {
    public static void main(String[] args) {
        // 创建Person实例
        Person person = new Person("小明");

        System.out.println("=== 父类引用子类的实例 ===");

        // 父类引用子类的实例 - Animal引用Dog
        Animal animal1 = new Dog("旺财");
        System.out.println("Animal引用Dog实例：");
        animal1.eat(); // 调用子类实现的抽象方法

        // 父类引用子类的实例 - Animal引用Cat
        Animal animal2 = new Cat("咪咪");
        System.out.println("Animal引用Cat实例：");
        animal2.eat(); // 调用子类实现的抽象方法

        System.out.println("\n=== 接口引用实现类的实例 ===");

        // 接口引用实现类的实例 - Afraid引用Dog
        Afraid afraid1 = new Dog("小黑");
        System.out.println("Afraid接口引用Dog实例：");
        afraid1.makeSounds();
        afraid1.escape();

        // 接口引用实现类的实例 - Afraid引用Cat
        Afraid afraid2 = new Cat("小花");
        System.out.println("Afraid接口引用Cat实例：");
        afraid2.makeSounds();
        afraid2.escape();

        System.out.println("\n=== 调用Person类的方法 ===");

        // 调用feed方法（使用Animal参数）
        person.feed(animal1);
        person.feed(animal2);

        // 调用catchAnimal方法（使用Afraid参数）
        person.catchAnimal(afraid1);
        person.catchAnimal(afraid2);

        System.out.println("\n=== 类型转换调用子类特有方法 ===");

        // 类型转换调用子类特有方法
        if (animal1 instanceof Dog) {
            Dog dog = (Dog) animal1;
            dog.bark();
        }

        if (animal2 instanceof Cat) {
            Cat cat = (Cat) animal2;
            cat.meow();
        }
    }
}